/**
 * request 网络请求工具
 * 更详细的 api 文档: https://github.com/umijs/umi-request
 */
import router from 'umi/router';
import { extend } from 'umi-request';
import { notification } from 'antd';
import { Login } from '@/constants/routes';

const codeMessage = {
  200: '服務器成功返回請求的數據。',
  201: '新建或修改數據成功。',
  202: '一個請求已經進入後台排隊（異步任務）。',
  204: '刪除數據成功。',
  400: '發出的請求有錯誤，服務器沒有進行新建或修改數據的操作。',
  401: '用戶沒有權限（令牌、用戶名、密碼錯誤）。',
  403: '用戶得到授權，但是訪問是被禁止的。',
  404: '發出的請求針對的是不存在的記錄，服務器沒有進行操作。',
  406: '請求的格式不可得。',
  410: '請求的資源被永久刪除，且不會再得到的。',
  422: '當創建一個對象時，發生一個驗證錯誤。',
  500: '服務器發生錯誤，請檢查服務器。',
  502: '網關錯誤。',
  503: '服務不可用，服務器暫時過載或維護。',
  504: '網關超時。',
};
/**
 * 异常处理程序
 */

const errorHandler = error => {
  console.log('errorerrorerrorerror', error);
  const { response } = error;
  const errorText = codeMessage[response.status] || response.statusText;
  if (response && response.status === 401) {
    // 登录失效,跳转登录页面
    error.message = '登錄過期,請重新登錄';
    // eslint-disable-next-line no-underscore-dangle
    if (window.g_app && window.g_app._store && window.g_app._store.dispatch) {
      // eslint-disable-next-line no-underscore-dangle
      window.g_app._store.dispatch({
        type: 'login/logout',
      });
    } else {
      router.push(Login.url);
    }
    throw error;
  }
  if (response && response.status) {
    const { status, url } = response;
    notification.error({
      message: `请求错误 ${status}: ${url}`,
      description: errorText,
    });
  } else if (!response) {
    notification.error({
      description: '您的网络发生异常，无法连接服务器',
      message: '网络异常',
    });
  }
  throw error;
};
/**
 * 配置request请求时的默认参数
 */

const request = extend({
  errorHandler,
  // 默认错误处理
  credentials: 'include', // 默认请求是否带上cookie
  responseType: 'json',
});

export const requestGetByToken = ({ url, query }) =>
  request(url, {
    method: 'GET',
    params: query,
  });
export const requestPostByToken = ({ url, body }) =>
  request(url, {
    method: 'POST',
    data: body,
  });
export const requestPutByToken = ({ url, body }) =>
  request(url, {
    method: 'PUT',
    data: body,
  });
export const requestDeleteByToken = ({ url, body }) =>
  request(url, {
    method: 'DELETE',
    data: body,
  });

export default request;
